package net.funtip.jdbc.entity;

import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class ParameterSetImpl implements ParameterSet, Comparable<ParameterSet> {
	
	private List<Object> parameters;

	public ParameterSetImpl() {
		super();
		parameters = new ArrayList<Object>();
	}

	private void addParameter(Object o) {
		parameters.add(o);
	}

	public Object getParameter(int i) {
		return parameters.get(i);
	}

	public List<Object> getParameters() {
		return parameters;
	}

	public void clear() {
		parameters.clear();
	}

	public void add(Timestamp x) {
		addParameter(x);
	}

	public void add(Time x) {
		addParameter(x);
	}

	public void add(short x) {
		addParameter(new Short(x));
	}

	public void add(Date x) {
		addParameter(x);
	}

	public void add(Calendar cal) {
		addParameter(cal);
	}

	public void add(int x) {
		addParameter(new Integer(x));
	}

	public void add(long x) {
		addParameter(new Long(x));
	}

	@SuppressWarnings("unchecked")
	public int compareTo(ParameterSet o) {
		List<Object> params = o.getParameters();
		if (params.size() != parameters.size()) {
			return parameters.size() - params.size();
		}
		for (int i=0; i<params.size(); i++) {
			if (params.get(i) instanceof Comparable) {
				int r = ((Comparable) parameters.get(i)).compareTo(params.get(i));
				if (r != 0) {
					return r;
				}
			} else {
				boolean eq = params.get(i).equals(parameters.get(i));
				if (!eq) {
					return 1;
				}
			}
		}
		return 0;
	}

	@Override
	public boolean equals(Object obj) {
		return compareTo((ParameterSet) obj) == 0;
	}

	@Override
	public int hashCode() {
		int fa = 1;
		int hash = 0;
		for (Object o: parameters) {
			hash += fa * o.hashCode();
			fa *= 10;
		}
		return hash;
	}

	@Override
	public String toString() {
		return "[" + parameters + "]";
	}


}
